home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
t_os
/
select
/
select.c
next >
Wrap
Text File
|
1991-10-18
|
3KB
|
130 lines
/* SELECT Ver1.2 */
/* Programmed by Yasu.Hara. */
/* ヘッダ取り込み */
#include <stdio.h>
#include <stdlib.h>
#include <egb.h>
#include <mos.h>
#include <snd.h>
#include <fmc.h>
#include <ctype.h>
#include <string.h>
/* 各値の定義 */
#define ARGMAX 20 /* メニューの最大数 */
#define LENMAX 79 /* メニューの文字列の最大長さ */
#define DOT 24 /* ボックスの縦方向ドット数 */
#define CHR '_' /* スペースに置き換える文字 */
#define COLOR1 1 /* カーソルが指してないボックスの色 */
#define COLOR2 2 /* カーソルが指しているボックスの色 */
#define iskanji(c) (0x81<=c && c<=0x9f || 0xe0<=c && c<=0xfc)
/* 漢字の1バイト目かどうかのチェック */
/* 各種シンボル */
int x=20, y[ARGMAX], l[ARGMAX];
char menu[ARGMAX][LENMAX+1];
char work[1536], mwork[4096], para[128];
/* ボックスを描く */
void box_write(num, col)
int num, col;
{
EGB_writePage(work, 1);
EGB_color(work, 2, col);
WORD(para+4)=(WORD(para+0)=320-x*4)+x*8-1;
WORD(para+6)=(WORD(para+2)=y[num])+DOT-1;
EGB_rectangle(work, para);
EGB_writePage(work, 0);
}
/* メインルーチン */
int main(argc, argv)
int argc;
char *argv[];
{
char *p;
int i, j, n, mx, my;
FILE *fp;
switch (--argc) {
case 0: /* パラメータがないよ~ */
return 0;
case 1: /* パラメータが1つだけ */
if ((fp=fopen(argv[1], "rt"))==NULL) return 0;
for (i=0; i<ARGMAX; i++) {
if (fgets(p=&menu[i][0], LENMAX+1, fp)==NULL) break;
if ((p=strchr(p, '\n'))!=NULL)
*p='\0';
else
while ((j=fgetc(fp))!='\n' && j!=EOF) ;
}
argc=i;
fclose(fp);
break;
default: /* パラメータが2つ以上 */
argc=_min(argc, ARGMAX);
for (i=0; i<argc; i++) {
strncpy(p=&menu[i][0], *++argv, LENMAX);
p[LENMAX]='\0';
while (*p!='\0') {
if (*p==CHR) *p=' ';
j=*p++;
if (iskanji(j) && *p++=='\0') break;
}
}
}
y[0]=(j=(480-argc*DOT)/(argc+3))*2;
for (i=1; i<argc; i++)
y[i]=y[i-1]+j+DOT;
for (i=0; i<argc; i++)
x=_max(x, l[i]=strlen(&menu[i][0]));
x=_min(x+8, 80);
EGB_init(work, sizeof(work));
EGB_resolution(work, 0, 3);
EGB_resolution(work, 1, 3);
EGB_displayPage(work, 0, 0);
EGB_paintMode(work, 0x22);
for (i=0; i<argc; i++) {
box_write(i, COLOR1);
WORD(para+2)+=DOT/2+7;
WORD(para+0)=320-(WORD(para+4)=j=l[i])*4;
_move(&menu[i][0], ¶[6], j);
EGB_sjisString(work, para);
}
EGB_displayPage(work, 0, 3);
_fill_char(mwork, sizeof(mwork), 0);
MOS_start(mwork, sizeof(mwork));
SND_elevol_init();
SND_elevol_set(1, 127, 127);
MOS_resolution(0, 3);
MOS_horizon(0, 639);
MOS_vertical(0, 479);
MOS_setpos(319,239);
MOS_disp(1);
n=argc;
do {
MOS_rdpos(&j, &mx, &my);
i=argc;
if ((mx=mx-320+x*4)>=0 && mx<x*8)
for (i=0; i<argc; i++)
if ((mx=my-y[i])>=0 && mx<DOT) break;
if (i!=n) {
MOS_disp(0);
if (n<argc) box_write(n, COLOR1);
n=i;
if (n<argc) box_write(n, COLOR2);
MOS_disp(1);
}
} while (j==0 || n>=argc);
MOS_end();
EGB_init(work, sizeof(work));
return n+1;
}